Go routine with channel 死锁
全部标签 我有一个作为ADO.net包装器的“数据库”类。例如,当我需要执行一个过程时,我调用Database.ExecuteProcedure(procedureName,parametersAndItsValues)。我们在SQLServer2000中遇到了死锁情况的严重问题。我们团队的一部分正在研究sql代码和事务以尽量减少这些事件,但我正在考虑使这个数据库类对死锁情况具有鲁棒性。我们希望死锁受害者在一段时间延迟后重试,但我不知道这是否可能。这是我们使用的方法的代码:publicintExecuteQuery(stringquery){introws=0;try{Command.Conne
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:C#/.NETanalysistooltofindraceconditions/deadlocks我正在调试一个我怀疑会死锁和挂起的应用程序。但是,这只会每隔几天发生一次,而且它从未在我的计算机上发生过,所以我无法将调试器连接到它。是否有任何实用程序或方法可用于查询正在运行的应用程序并找出哪些方法/锁/无论它死锁在什么上?更新:通常应用程序在客户位置运行,而我无法访问机器,而且我不太愿意要求他们安装大量软件。
除此之外,假设我在VS中运行我的应用程序,我不知道现在是否可以重现它(我已经使用这个特定应用程序一两个星期没有问题)调试器,发生死锁后我应该如何进行调试?我认为如果我暂停程序我可能能够获得调用堆栈并因此查看它发生时不同线程的位置,但是单击暂停也只会使VisualStudio陷入死锁,直到我终止我的应用程序。除了浏览我的源代码树以查找潜在问题之外,还有其他方法吗?一旦出现问题,是否有办法进入调用堆栈以查看问题出在哪里?还有其他可能有用的工具/提示/技巧吗? 最佳答案 你做的是正确的方法。如果VisualStudio也死锁,这种情况时有
我读过几篇文章和帖子说lock(this),lock(typeof(MyType)),lock("astring")都是不好的做法,因为另一个线程可能锁定同一个键并导致死锁。为了理解这个问题,我试图创建一些示例代码来说明死锁,但一直无法解决这个问题。有人可以写一段简洁的代码来说明这个经典问题吗?请保持简短,我只能消化较小块的代码。编辑:我认为lassevk总结得很好;真正的问题是你失去了对锁的控制。一旦发生这种情况,您将无法控制调用锁的顺序,并且您正在允许潜在的死锁情况。lock(this)、lock(typeof(MyType))等都是您选择了无法控制的锁的情况。
是否有分析.NET代码并发现竞争条件的工具?我有一些代码具有获取或创建私有(private)静态字段的公共(public)静态属性。它还具有一个公共(public)静态方法,可将此字段设置为null(...是的,我知道!...)由于这两种方法都没有锁定,所以可以肯定的是,将来事情会变得非常糟糕。我需要一个工具来递归地检查调用这些方法中的任何一个的东西,并查看是否在另一个线程上产生了任何东西。我正在寻找一个工具或者一个nDependSQL脚本(如果可能的话)。 最佳答案 您可能正在寻找其中之一:CHESSTypemockRacer注意
为什么这段代码不会造成死锁?privatestaticreadonlyobjecta=newobject();...lock(a){lock(a){....}} 最佳答案 如果线程已经持有锁,那么它可以毫无问题地再次“获取该锁”。至于为什么,即(以及为什么这是个好主意),请考虑以下情况,我们在a->b的程序的其他地方定义了锁顺序:voidf(){lock(a){/*dostuffinsidea*/}}voiddoStuff(){lock(b){//dostuffinsideb,thatinvolvesleavingbinaninco
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Re-entrantlocksinC#如果我写这样的代码:classProgram{staticvoidMain(string[]args){Foo();Console.ReadLine();}staticvoidFoo(){lock(_lock){Console.WriteLine("Foo");Bar();}}staticvoidBar(){lock(_lock){Console.WriteLine("Bar");}}privatestaticreadonlyobject_lock=newobject()
我发现了一些使用c#的async/await关键字进行异步编程的最佳实践(我是c#5.0的新手)。给出的建议之一如下:稳定性:了解您的同步上下文...一些同步上下文是不可重入的和单线程的。这意味着在给定时间只能在上下文中执行一个工作单元。WindowsUI线程或ASP.NET请求上下文就是一个例子。在这些单线程同步上下文中,很容易让自己陷入死锁。如果您从单线程上下文中生成任务,然后在上下文中等待该任务,您等待的代码可能会阻塞后台任务。publicActionResultActionAsync(){//DEADLOCK:thisblocksontheasynctaskvardata=Ge
我有以下四个测试,最后一个在我运行时挂起。为什么会这样:[Test]publicvoidCheckOnceResultTest(){Assert.IsTrue(CheckStatus().Result);}[Test]publicasyncvoidCheckOnceAwaitTest(){Assert.IsTrue(awaitCheckStatus());}[Test]publicasyncvoidCheckStatusTwiceAwaitTest(){Assert.IsTrue(awaitCheckStatus());Assert.IsTrue(awaitCheckStatus())
我不太明白Task.Wait和await之间的区别。我在ASP.NETWebAPI服务中有类似于以下功能的东西:publicclassTestController:ApiController{publicstaticasyncTaskFoo(){awaitTask.Delay(1).ConfigureAwait(false);return"";}publicasyncstaticTaskBar(){returnawaitFoo();}publicasyncstaticTaskRos(){returnawaitBar();}//GETapi/testpublicIEnumerableGe